第 19 天~
昨天做到了,新增項目的部分,
像這樣:

當我們可以成功的展示新增的項目後,
我們希望可以按一下項目,就讓他切換 完成 | 未完成,
我們把焦點放到 FlatList ,
<FlatList
data={list}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea]}></View>
<Text style={[styles.itemText]}>{item.text}</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
在 TouchableOpacity component 的 onPress 加入 changeItemStatus,
changeItemStatus = (id) => () => {
const { list } = this.state;
const index = list.findIndex((item) => item.id === id);
const nowItem = list[index];
const newStatus = nowItem.status === 'done' ? 'not done' : 'done';
list[index] = {
...nowItem,
status: newStatus,
};
this.setState(() => {
return {
list: [...list],
};
});
};
changeItemStatus 會先放入 item 的 id,
最後返回一個 function 放入 onPress 等待觸發,
主要在座的就是從 list 取出 item 資訊,
判斷之後的 status 並做出改變,
最後在更新 list
結果會是:
嗯... 未啥畫面不動,
...對了,還需要加入 style,
更新過後的 FlatList component
<FlatList
data={list}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
const isDone = item.status === 'done';
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle, isDone && styles.itemDone]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea, isDone && styles.tick]}></View>
<Text style={[styles.itemText, isDone && styles.doneText]}>
{item.text}
</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
結果如下:

這樣我們完成了改變項目的狀態
設定 state , 新增 filterKey
this.state = {
filterKey: '',
inputValue: '',
list: [],
};
在 FlatList component 根據 filterKey filter list
<FlatList
data={list.filter((item) => item.text.includes(filterKey))}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
const isDone = item.status === 'done';
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle, isDone && styles.itemDone]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea, isDone && styles.tick]}></View>
<Text style={[styles.itemText, isDone && styles.doneText]}>
{item.text}
</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
在 Search 的按鈕這裡,加入 searchList function,
<TouchableOpacity style={styles.button} onPress={this.searchList}>
<Text style={styles.buttonText}>Search</Text>
</TouchableOpacity>
searchList 根據 inputValue 更新 filterKey
searchList = () => {
this.setState((state) => {
return {
filterKey: state.inputValue,
};
});
};
結果為:

在 Complete All 的按鈕這裡,加入 handleCompleteAll function,
<TouchableOpacity style={styles.button} onPress={this.handleCompleteAll}>
<Text style={styles.buttonText}>Complete All</Text>
</TouchableOpacity>
handleCompleteAll 會把所有的 list status 全部設定為 done
handleCompleteAll = () => {
this.setState((state) => {
return {
list: state.list.map((item) => {
return {
...item,
status: 'done',
};
}),
};
});
};
結果為:

至此,我們的邏輯全部跟畫面連接上了